﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml;
using System.Xml.Linq;
using METODESA.Server.Data.Exceptions;
using METODESA.Server.Data.METODESA.Entity;
using METODESA.Server.Data.METODESA.Factorys;
using METODESA.Server.Data.METODESA.Nhibernate;
using Metodesa.Logic;
using Metodesa.Tools;

namespace Metodesa.Views.Home
{
    public partial class ListEmpleado : Page
    {

 
     
        /// <summary>
        /// Procedimiento ligado al evento on Page Load
        /// </summary>
        protected void Page_Load(object sender, EventArgs e)
        {
            if (validatorCedula.ValidationExpression.Equals(""))
            {
                loadExpressions();
            }
            if (validatorCedula.ErrorMessage.Equals(""))
            {
                loadMessages();
            }

            label.Visible = false;
            ListEmpleados.Visible = false;
            PanelAddEmpleado.Visible = false;
            PanelEditEmpleado.Visible = false;
            if(Session["User"]!=null)
            {
                Empleado usuario=(Empleado)Session["User"];
            }
            else
            {
              Response.Redirect("../../Views/Home/Index.aspx", true);
            }

            int ids = -1;


            String action = Request.QueryString.Get("a");
            if (action != null)
            {

                if (action.Equals("s")) // Select for update
                {
                    prepareDetailsUpdate();  //Preparo el panel para hacer Update
                }
               
                else if (action.Equals("d"))
                {
                    // DELETE

                    ids = int.Parse(Request.QueryString.Get("id"));
                    EmpleadoDao.deleteEntity(EmpleadoDao.getEmpleadoById(ids));
                }
            }
            else
                PanelEditEmpleado.Visible = false;
 

        }
        private void loadMessages()
        {
            XmlDocument xDoc = new XmlDocument();
            string path = Path.Combine(Server.MapPath("~"), @"Messages.xml");
            xDoc.Load(path);

            XmlNodeList lista = xDoc.GetElementsByTagName("message");
            foreach (XmlElement element in lista)
            {
                if (element.GetAttribute("name").Equals("requeridoNombre"))
                {
                    RequiredFieldNombre.ErrorMessage =element.GetAttribute("error");
                    RequiredFieldNombre2.ErrorMessage = element.GetAttribute("error");

                } 
                else if (element.GetAttribute("name").Equals("requeridoApellido"))
                {
                    RequiredFieldApellido.ErrorMessage = element.GetAttribute("error");
                    RequiredFieldApellido.ErrorMessage = element.GetAttribute("error");

                }  
                else if (element.GetAttribute("name").Equals("requeridoCedula"))
                {
                    RequiredFieldCedula.ErrorMessage = element.GetAttribute("error");
                    RequiredFieldCedula2.ErrorMessage = element.GetAttribute("error");

                }
                else if (element.GetAttribute("name").Equals("formatoCedula"))
                {
                    validatorCedula.ErrorMessage = element.GetAttribute("error");
                    validatorCedula2.ErrorMessage = element.GetAttribute("error");

                }

            }

         
        }
        private void loadExpressions()
        {
            XmlDocument xDoc = new XmlDocument();
            string path = Path.Combine(Server.MapPath("~"), @"Validations.xml");
            xDoc.Load(path);
            
            XmlNodeList lista = xDoc.GetElementsByTagName("validation");
            foreach (XmlElement element in lista)
            {
                if (element.GetAttribute("name").Equals("cedula"))
                {   
                    validatorCedula.ValidationExpression = element.GetAttribute("expression");
                    validatorCedula2.ValidationExpression = element.GetAttribute("expression");
                } 
                
            }
        }

        /// <summary>
        /// Procedimiento para preparar el panel para modificar 
        /// Hace el panel visible y carga los valores de la entidad a modificar
        /// </summary>
        private void prepareDetailsUpdate() 
        {
            int ids;
            PanelAddEmpleado.Visible = false;
            PanelEditEmpleado.Visible = true; // Hacer Visible el panel de detalles
            ids = int.Parse(Request.QueryString.Get("id"));
            Empleado empleado = EmpleadoDao.getEmpleadoById(ids); // Busco el empleado seleccionado
            teId.Text = ids.ToString();
            teName.Text = empleado.Nombre;
            teLastName.Text = empleado.Apellido;                // Asigno todos los textBox los valores q tiene el cliente
            teUser.Text = empleado.Login;
            teCi.Text = empleado.Cedula.ToString();
            tePassword.Text = empleado.Pass;
            teAddress.Text = empleado.Direccion;
        }
        /// <summary>
        /// Procedimiento para Editar los empleados, llamado desde la accion del boton de Editar
        /// </summary>
        private void EditEmpleado()
        {
            try
            {
            
            string password = "", login = "";
            PanelEditEmpleado.Visible = false;
            PanelAddEmpleado.Visible = false;
            Empleado empleado = EmpleadoDao.getEmpleadoById(int.Parse(teId.Text));

            if (tePassword.Text != "")
                password = tePassword.Text;
            
            if (teUser.Text != "")
                login = teUser.Text;


            empleado.Nombre = teName.Text;
            empleado.Apellido = teLastName.Text;
            empleado.Cedula = teCi.Text;
            empleado.Login = teUser.Text;
            empleado.Direccion = teAddress.Text;
            EmpleadoLogic.update(empleado, login, password);
            label.Visible = true;
            label.ForeColor = Color.Blue;
            label.Text = "Empleado mofificado satifactoriamente";


        }
          catch (EntityCouldntBeUpdated exception)
            {
                Session.Add("Error", exception);
                label.Visible = true;
                label.ForeColor = Color.Red;
                label.Text = "No se pudo modificar el empleado";
                PanelEditEmpleado.Visible = true;
                
            }
            catch (Exception exception)
            {
                Session.Add("Error", exception);
                Response.Redirect("../../Views/Home/Error.aspx", true);


            }
    
            
        }


        /// <summary>
        /// Prepara el panel para agregar un nuevo empleado, haciendo el panel visible
        ///  y seteando los campos a vacio
        /// </summary>
        private void prepareDetailsAdd()
        {
            ListEmpleados.Visible = false;
            PanelAddEmpleado.Visible = true;

            taUser.Text = "";
            taName.Text = "";
            taLastName.Text = "";
            taCi.Text = "";
            taPassword.Text = "";


        }
        /// <summary>
        /// Procedimiento para agregar empleados, llamado desde el boton de agregar
        /// </summary>
        private void AddEmpleado()
        {
            PanelAddEmpleado.Visible = false;
            PanelEditEmpleado.Visible = false;

            Session.Add("field", null);
            Session.Add("selected", null);
            
          
            Empleado empleado = FactoryEmpleado.getEmpleado(taLastName.Text, taCi.Text, taAddress.Text,taUser.Text, taName.Text, taPassword.Text, "");

          
            if (EmpleadoLogic.save(empleado) != 0)
            {
                label.Visible = true;
                label.ForeColor = Color.Red;
                label.Text = "No se pudo agregar el empleado";
                PanelAddEmpleado.Visible = true;
            }
            else
            {
                label.Visible = true;
                label.ForeColor = Color.Blue;
                label.Text = "Empleado agregado satifactoriamente";

            }

        }

        protected void PrepareAddButton_Click(object sender, EventArgs e)
        {
            prepareDetailsAdd();
        }

        /// <summary>
        /// Procedimiento ligado al evento de el boton para buscar
        /// </summary>
        protected void FindButton_Click(object sender, EventArgs e)
        {
            IList<Empleado> lista;
            if (option != null && option.SelectedItem != null)
                lista = EmpleadoLogic.processSearch(searchbox.Text, option.SelectedValue);
            else
                lista = EmpleadoLogic.processSearch(searchbox.Text, "");

            HtmlTable table = EmpleadosTools.ListEmpleados(lista);


            if (table != null)
            {
                ListEmpleados.Controls.Add(table);
                ListEmpleados.Visible = true;
            }
            else
            {
                label.Visible = true;
                label.ForeColor = Color.DarkRed;
                label.Text = "No se encontraron empleados que cumplan con la búsqueda";
            }
        }

        protected void EditButton_Click(object sender, EventArgs e)
        {
            EditEmpleado();
        }

        protected void AddButton_Click(object sender, EventArgs e)
        {
            AddEmpleado();
        }


    }
}


 
